# 一些糖果 candies，打算把它们分给排好队的 n = num_people 个小朋友。
# 给第一个小朋友 1 颗糖果，第二个小朋友 2 颗，依此类推，直到给最后一个小朋友 n 颗糖果。
# 然后，我们再回到队伍的起点，给第一个小朋友 n + 1 颗糖果，第二个小朋友 n + 2 颗，依此类推，直到给最后一个小朋友 2 * n 颗糖果。
# 重复上述过程（每次都比上一次多给出一颗糖果，当到达队伍终点后再次从队伍起点开始），直到我们分完所有的糖果。
# 就算我们手中的剩下糖果数不够（不比前一次发出的糖果多），这些糖果也会全部发给当前的小朋友。
#
# 返回一个长度为 num_people、元素之和为 candies 的数组，以表示糖果的最终分发情况（即 ans[i] 表示第 i 个小朋友分到的糖果数）。

# 输入:
# candies = 7
# num_people = 4
# 输出:
# [1,2,3,1]


# 输入:
# candies = 10
# num_people = 3
# 输出:
# [5,2,3]


# https://leetcode-cn.com/problems/distribute-candies-to-people


# 执行用时 44 ms 击败了 60.69% 的用户
# 内存消耗  13.5 MB 击败了 23.58% 的用户


def distributeCandies(candies: int, num_people: int):
    ans = [0] * num_people
    loop_time = 0
    while True:
        for i in range(num_people):
            loop_time += 1
            if candies - loop_time >= 0:
                ans[i] += loop_time
                candies -= loop_time
            elif candies - loop_time < 0:
                ans[i] += candies
                return ans


# 效率太差了...
# 怀疑是因为上来先创建列表的缘故
# 能想到的优化是 总之先在循环里插入数据,return 之前如果列表长度不足
# 再用0补满结果列表


# 不对打脸了 ,看了官方标答 一上来声明指定长度列表的操作是没毛病的
# 优化点在于后面的写法


def distributeCandies_2(candies: int, num_people: int):
    ans = [0] * num_people
    i = 0
    while candies != 0:
        ans[i % num_people] += min(i + 1, candies)
        candies -= min(i + 1, candies)
        i += 1
    return ans


result = distributeCandies_2(11,1)
print(result)
